<?php
header ( 'Content-type:text/html;charset=utf-8' );
include_once $_SERVER ['DOCUMENT_ROOT'] . "/upacp_demo_b2b/sdk/acp_service.php";

class ectools_ctl_payment_filetransfer extends importexport_controller{

	public function __construct($app)
	{
		parent::__construct($app);
		header("cache-control: no-store, no-cache, must-revalidate");
	}

	function index(){
		$this->pagedata['txnTime']=date('YmdHis');
		$this->pagedata['settleDate']='0119';
		$this->page('filetransfer.html');
	}
	
	function download(){
		$params = array (
		'version' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,
		'signMethod' => com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,
		'encoding' => 'UTF-8',
		//固定76
		'txnType' => '76',
		//01对账文件下载
		'txnSubType' => '01',
		//固定000000
		'bizType' => '000000',
		//普通商户直接连入
		'accessType' => '0', 
		//参考资料7.1商户索取的文件类型约定, 00为商户号15位_日期.zip
		'fileType' => '00', 
		// 订单发送时间，取北京时间，格式为YYYYMMDDhhmmss
		'txnTime' => $_POST ["txnTime"],
		// 商户代码，请替换实际商户号测试，如使用的是自助化平台注册的商户号（777开头的），该商户号没有权限测文件下载接口的，请使用测试参数里写的文件下载的商户号和日期测，如需真实交易文件，请使用自助化平台下载文件，此处默认取demo演示页面传递的参数	
		'merId' => $_POST ["mer_Id"], 
		// 清算日期，格式为MMDD
		'settleDate' => $_POST ["settleDate"]
		);
		com\unionpay\acp\sdk\AcpService::sign ( $params );
		$url = com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->fileTransUrl;
		$result_arr = com\unionpay\acp\sdk\AcpService::post ( $params, $url );
		//没收到200应答的情况
		if(count($result_arr)<=0) { 
			//printResult ( $url, $params, "" );
			echo '没收到200应答的情况.';
			return;
		}

		//printResult ($url, $params, $result_arr ); //页面打印请求应答数据

		if (!com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
			echo "应答报文验签失败<br>\n";
			return;
		}

		echo "应答报文验签成功<br>\n";
		if ($result_arr["respCode"] == "98"){
			//文件不存在
			echo "文件不存在。<br>\n";
			return;
		} else if ($result_arr["respCode"] != "00") {
		//其他应答码做以失败处理
			echo "失败：respCode=" . $result_arr["respCode"] . "。<br>\n";
			return;
		}

		echo "返回成功。<br>\n";
		//固定下载到服务器的文件位置,这里设置为ftp路径(最好动态读取)
		$storage = $this->get_storage_params();
		$filePath=$storage['dir'];
		if (substr($filePath,-1)!="/")$filePath.="/";
		//处理文件，保存路径上面那行设置，注意预先建立文件夹并授读写权限
		if ( com\unionpay\acp\sdk\AcpService::deCodeFileContent( $result_arr,  $filePath) == false) {
			echo '文件保存失败，请查看日志提示的错误信息<br\n>';
			return;
		}

		echo '文件已成功保存到' . $filePath. "目录下<br\n>";
		$filename=$result_arr['fileName'];
		//$this->file_download(basename($filename,'.zip'),$msg);
		//echo $msg;
		$this->xiazai($filePath,$filename);
	}

	//网上找的代码,可以用
	function xiazai($file_dir,$file_name)
	//参数说明：
	//file_dir:文件所在目录
	//file_name:文件名
	{
	     $file_dir = chop($file_dir);//去掉路径中多余的空格
	     //得出要下载的文件的路径
	     if($file_dir != '')
	     {
		 $file_path = $file_dir;
		 if(substr($file_dir,strlen($file_dir)-1,strlen($file_dir)) != '/')
		     $file_path .= '/';
		 $file_path .= $file_name;
	     }            
	     else
		 $file_path = $file_name;    
	     
	     //判断要下载的文件是否存在
	     if(!file_exists($file_path))
	     {
		 alert('对不起,你要下载的文件不存在');
		 return false;
	     }
	 
	     $file_size = filesize($file_path);
	 
	     header("Content-type: application/octet-stream;charset=gbk");
	     header("Accept-Ranges: bytes");
	     header("Accept-Length: $file_size");
	     header("Content-Disposition: attachment; filename=".$file_name);
	     
	     $fp = fopen($file_path,"r");
	     $buffer_size = 1024;
	     $cur_pos = 0;
	     
	     while(!feof($fp)&&$file_size-$cur_pos>$buffer_size)
	     {
		 $buffer = fread($fp,$buffer_size);
		 echo $buffer;
		 $cur_pos += $buffer_size;
	     }
	     
	     $buffer = fread($fp,$file_size-$cur_pos);
	     echo $buffer;
	     fclose($fp);
	     return true;
	 
	}
	    //商派的下载代码, 下载zip成功, 但解压失败
	    public function file_download($key,&$msg){
		//$params = app::get('importexport')->model('task')->getList('*',array('task_id'=>$_GET['task_id']));
		//$params = $params[0];
		 $params = array(
		  'task_id'=>'',
		  'name'=>'b2bfile',
		  'message'=>'',
		  'filetype'=>'zip',
		  'create_date'=>'',
		  'complete_date'=>'',
		  'type'=>'export',
		  'status'=>'2',
		  'is_display'=>'1',
		  'key'=>$key,
		);		
 
		if($params['status'] == '2' || $params['status'] =='6' || $params['status'] =='8'){
		    //连接存储服务器
		    $this->policyObj = kernel::single('importexport_policy');
		    $msg = $this->policyObj->connect();
		    if ( $msg !== true ){
			return false;
		    }

		    $filename = $this->policyObj->create_remote_file($params);
		    if( !$this->policyObj->create_local_file() ){
			$msg = app::get('importexport')->_('本地文件创建失败，请检查/tmp文件夹权限');
			return false;
		    }
		    //edit by peter 2017-04-14 这个类是针对csv下载的, 用来下载zip时损坏,未解决
		    $filetypeObj = kernel::single('importexport_type_csv');

		    $size = $this->policyObj->remote_file_size($filename);
		    if( $size === 0 )
		    {
			$msg = app::get('importexport')->_('需要下载的文件为空，不需要下载');
			return false;
		    }
		    if( $size < 0 )
		    {
			$msg = app::get('importexport')->_('需要下载的文件在ftp端不存在，请检查ftp服务器和原始数据');
			return false;
		    }

		    $range = $filetypeObj->set_queue_header($filename,$size);
		    if( !$this->policyObj->pull(array('resume'=>$range),$msg) ){
		       return false;
		    }

		    //实例化导出文件类型类
		    $file = fopen($this->policyObj->local_file,"rb");
		    if( method_exists($filetypeObj, 'setBom') ){
			$bom = $filetypeObj->setBom();
			echo $bom;
		    }
		    while(!feof($file)){
			set_time_limit(0);
			print_r(fread($file,1024*8));
			ob_flush();
			flush();
		    }
		    $this->policyObj->close_local_file();
		}
		exit;
	    }
}
